#pragma once

#include "ICollideAble.h"
#include "Plane.h"

////////////////////////////////////////////////////////////////////////////////////////////////////
/// <Summary>	Frustrum  </Summary>
/// 
/// <purpose>	Collidable class that defines 6-sided frustrum </purpose>
////////////////////////////////////////////////////////////////////////////////////////////////////

class Frustrum : public ICollideAble
{
public:

	/// <Summary> The planes that make up this frustrum </Summary>
	/// <Remarks> Near, far, left, right, top, bottom </Remarks>
	Plane planes[6];

	/// <Summary> The points that surround this frustrum </Summary>
	Vector3 points[8];

public:

	////////////////////////////////////////////////////////////////////////////////////////////////////
	/// <Summary>	Default constructor. </Summary>
	////////////////////////////////////////////////////////////////////////////////////////////////////
	Frustrum() { }

	////////////////////////////////////////////////////////////////////////////////////////////////////
	/// <Summary>	Virtual Destructor </Summary>
	////////////////////////////////////////////////////////////////////////////////////////////////////
	virtual ~Frustrum() { }

public:

	/// <Summary> The collision type of this object </Summary>
	static const HashString COLLISIONTYPE;

	////////////////////////////////////////////////////////////////////////////////////////////////////
	/// <Summary>	Gets the collision type </Summary>
	///
	/// <Return>	The collision type </Return>
	////////////////////////////////////////////////////////////////////////////////////////////////////
	virtual const HashString& GetCollisionType() const { return COLLISIONTYPE; }

	////////////////////////////////////////////////////////////////////////////////////////////////////
	/// <Summary>	Transforms this object by a matrix </Summary>
	///
	/// <Param name="transform">	The transform matrix	</Param>
	////////////////////////////////////////////////////////////////////////////////////////////////////
	virtual void Transform(const Matrix4x4& transform);

	////////////////////////////////////////////////////////////////////////////////////////////////////
	/// <Summary>	Builds the frustrum </Summary>
	///
	/// <Param name="fov">	   	The field of view </Param>
	/// <Param name="width">   	The width </Param>
	/// <Param name="height">  	The height </Param>
	/// <Param name="nearDist">	The near distance </Param>
	/// <Param name="farDist"> 	The far distance </Param>
	////////////////////////////////////////////////////////////////////////////////////////////////////
	void Build(float fov, float width, float height, float nearDist, float farDist);

protected:

	////////////////////////////////////////////////////////////////////////////////////////////////////
	/// <Summary>	Prints this object to the console </Summary>
	///
	/// <Param name="out">	The console window </Param>
	///
	/// <Return>	The console window </Return>
	////////////////////////////////////////////////////////////////////////////////////////////////////
	virtual ConsoleWindow& Print(ConsoleWindow& out) const;
};